﻿/*+===================================================================
File:      EnemyDiver.cpp

Summary:   Định nghĩa các phương thức của CEnemyDiver.
===================================================================+*/

#include "EnemyDiver.h"
#include "PlayState.h"

// Trạng thái của EnemyDiver.
#define STATUS_DIVE		 0
#define STATUS_FIRE      1

int spritesEnemyDiverId[2]
{
	ID_SPRITE_ENEMY_DIVER_DIVE,
	ID_SPRITE_ENEMY_DIVER_FIRE,
};

CEnemyDiver::CEnemyDiver(CBill* bill, D3DXVECTOR2 pos, int id, int typeId) : CMoveableObject(pos, id, typeId)
{
	CResourcesManager::GetInstance()->GetSprite(ID_SPRITE_ENEMY_DIVER_DIVE);
	CResourcesManager::GetInstance()->GetSprite(ID_SPRITE_ENEMY_DIVER_FIRE);
	m_nStatus = STATUS_DIVE;
	m_pSprite = m_pResourceManager->GetSprite(ID_SPRITE_ENEMY_DIVER_DIVE);
	m_pGun = new CGun(ID_ENEMY_DIVER_BULLET, 3, 3);
	m_bill = bill;

	m_box.width = 40;
	m_box.height = 30;
}

CEnemyDiver::~CEnemyDiver()
{
	if (m_pGun)
		delete m_pGun;
}

void CEnemyDiver::UpdateBox(float timeFrame)
{
	m_box.x = m_pos.x - m_pSprite->GetWidth() / 2.0f;
	m_box.y = m_pos.y - m_pSprite->GetHeight() / 2.0f + m_box.height;
}

void CEnemyDiver::Update(float timeFrame)
{
	if (!m_bIsLive)
		return;

	// Sau khi bắn xong thì lặn tiếp.
	if (m_nStatus == STATUS_FIRE)
	{
		if (m_fTimeFire > 0)
		{
			m_fTimeFire -= timeFrame;
		}
		else
		{
			m_fTimeFire = 0.0f;
			m_nStatus = STATUS_DIVE;
		}
	}

	// Khi đang ở trạng thái lặn và có đủ đạn để bắn thì bắn.
	if (m_nStatus == STATUS_DIVE && m_pGun->IsFullBullets())
	{
		if (m_fTimeReFire > 0)
		{
			m_fTimeReFire -= timeFrame;
		}
		else
		{
			Fire();
		}
	}

	m_pSprite = m_pResourceManager->GetSprite(spritesEnemyDiverId[m_nStatus]);
	m_pSprite->Update(timeFrame);
	UpdateBox(timeFrame);
}

void CEnemyDiver::UpdateCollision(vector<CGameObject*> vecGameObjs, float timeFrame)
{
	if (!m_bIsLive || m_nStatus != STATUS_FIRE)
		return;

	float timeCollision = timeFrame;
	CGameObject* objCollision = NULL; // Đối tượng va chạm sớm nhất.
	float normalx = 0.0f, normaly = 0.0f;

	// Xử lí va chạm với đạn của Bill
	for (int i = 0; i < CPlayState::s_billBullets.size(); i++)
	{
		if (CPlayState::s_billBullets[i]->IsLive())
		{
			float t = CheckCollision(CPlayState::s_billBullets[i], normalx, normaly, timeFrame);

			if (t < timeFrame && t < timeCollision)
			{
				// Tìm đối tượng và thời gian va chạm sớm nhất.
				timeCollision = t;
				objCollision = CPlayState::s_billBullets[i];
			}
		}
	}

	// Xử lí va chạm
	if (objCollision != NULL)
	{
		this->Kill();
		objCollision->Kill();
	}
}

bool CEnemyDiver::Kill()
{
	m_bIsLive = false;

	CExplosion* ex = new CExplosion(m_pos, 0, ID_ENEMY_EXPLOSION);
	CPlayState::s_objsOutSideQuadTree.push_back(ex);
	g_nScore += 100;
	return true;
}

void CEnemyDiver::Fire()
{
	D3DXVECTOR2 billPos = m_bill->GetPos();

	if (g_nCurentLvl == ID_LEVEL2)
	{
		if ((billPos.y < m_pos.y + 100) ||
			(billPos.y > m_pos.y + 300))
			return;
	}
	else
	{
		if ((billPos.x < m_pos.x - 100) ||
			(billPos.x > m_pos.x + 200))
			return;
	}

	m_fTimeReFire = 1.0f;
	m_fTimeFire = 0.4f;
	D3DXVECTOR2 bulletPos;
	bulletPos.x = m_pos.x + m_pSprite->GetWidth() / 4.0f;
	bulletPos.y = m_pos.y + m_pSprite->GetHeight() / 2.0f;
	m_pGun->Fire(bulletPos);
	m_nStatus = STATUS_FIRE;
}